// 后端服务通信
var express = require('express');
// 静态目录
var serveStatic = require('serve-static');
// 中间件将表单的提交内容解析成对象来调用
var bodyParser = require('body-parser');
// express4 需要单独引入cookie-parse 以支持session功能
var logger = require('morgan');
// cookie
var cookieParser = require('cookie-parser');
// express4 将session模块分离出去了
var session = require('express-session');
// 解析多类型的表单提交
var multiparty = require('connect-multiparty');
// mongoDB下的session的持久化方案
var mongoStore = require("connect-mongo")(session);
// mongoDB插件
var mongoose = require('mongoose');
// 新的版本的mongoose不在集成Promose模块， 因此需要另外引入
mongoose.Promise = require('bluebird');
// 用来操作文件路径
var path = require('path');
// 端口
var port = process.env.PORT || 3000;
// express对象，用于配置服务器和路由等
var app = express();
var dbUrl = 'mongodb://127.0.0.1:34162/movie';
// app 全局变量
app.locals.moment = require('moment');

mongoose.connect(dbUrl, {
  useMongoClient: true
});

// 视图渲染
app.set('views', './app/views/pages/');
app.set('view engine', 'pug');

// 新版express4中bodyParser 已经不再与Express捆绑
// 要独立安装serve-static，npm install serve-static --save
// app.use(express.bodyParser());
// app.use(express.static(path.join(__dirname, 'bower_components')));
// 使用中间件 - 注意必须放在所有路由后面使用已确保执行顺序正确
// 将/public路径设置成静态资源的根路径 - css js images
app.use(serveStatic(path.join(__dirname, 'public')));
// 解析表单中提交的数据为json格式
app.use(bodyParser.urlencoded({
  extended: true
}));
// 支持session 因此要放在session之前使用
app.use(cookieParser());
// 使用express的session中间件
app.use(session({
  name: 'connect.sid',
  // cookie 中保存 session id 的字段名称，默认为connect.sid
  secret: 'niit',
  // 通过设置 secret 来计算 hash 值并放在 cookie 中，使产生的 signedCookie 防篡改
  resave: true,
  // resave 如果为true，则每次请求都重新设置session的 cookie的过期时间
  saveUninitialized: false,
  // 如果为true, 则无论有没有session的cookie，每次请求都重新设置session cookie
  store: new mongoStore({
    url: dbUrl, // 保存session使用的mongoDB的URL地址
    auto_reconnect: true, // issue 推荐解决方法
    collection: "sessions" // mongo中用于保存session信息的的集合名称
  })
}));
// 用于支持上传下载
app.use(multiparty());


var env = process.env.NODE_ENV || 'development';
console.log('-------->','current env :',env,'<--------');
// 开发环境的日志打印
if ('development' === env) {
  app.set('showStackError', true);
  app.use(logger(':method :url :status'));
  app.locals.pretty = true;
  mongoose.set('debug',true);
}

app.listen(port);
console.log('app started on port ' + port);

// 路由
require('./config/routes')(app);
